package utils

import (
	"io/fs"
	"os"
	"path"
	"strconv"
)

// func getValue[T](key string, defaultValue T) T {
// 	v := os.Getenv(key)
// 	if len(v) == 0 {
// 		return defaultValue
// 	}
// }

func GetEnv(key string, defaultValue string) string {
	v := os.Getenv(key)
	if len(v) == 0 {
		return defaultValue
	}
	return v
}

func ParseInter(s string, defaultValue int) (i int) {
	if i, err := strconv.Atoi(s); err == nil {
		return i
	}
	return defaultValue
}

func IsExists(ps ...string) bool {
	if len(ps) == 0 {
		return false
	}

	p := path.Join(ps...)

	if _, err := os.Stat(p); err != nil {
		return false
	}
	return true
}

func IsFile(path string) bool {
	if info, err := os.Stat(path); err == nil {
		return info.Mode().IsRegular()
	}
	return false
}

func IsDir(path string) bool {
	if info, err := os.Stat(path); err == nil {
		// 包含 软连接!
		return info.Mode().IsDir()
	}
	return false
}

func ListDir(onlyRegular bool, directorys ...string) (dirs_files []fs.DirEntry) {
	// 这个 directorys 可以是软连接
	dir := path.Join(directorys...)
	lists, err := os.ReadDir(dir)
	if err != nil {
		// log.Fatalf("list dir err:path=%s, err=%v", dir, err)
	}

	dirs_files = make([]fs.DirEntry, 0, 10)

	// 软连接 包含在里面吗? 不, 需要重新处理.
	for _, f := range lists { // sorted by name
		if f.Type().IsRegular() {
			dirs_files = append(dirs_files, f)
			continue
		}

		// if !onlyRegular && f.IsDir() {
		if !onlyRegular && IsDir(path.Join(dir, f.Name())) {
			//onlyRegular -> 包含 dir
			// 不包含 软连接!
			dirs_files = append(dirs_files, f)
		}
	}

	// } else if f.Type()&os.ModeSymlink != 0 {
	// 	if finfo, err := os.Stat(path.Join(dir, f.Name())); err == nil && finfo.IsDir() {
	// 		fmt.Printf("[i] is ModeSymlink && target is Dir f.Name(): %v\n", f.Name())
	// 		// 不处理 软连接的文件!
	// 		dirs = append(dirs, f)
	// 	}
	// }
	return
}

func GetDirs(directorys ...string) (dirs_files []fs.DirEntry) {
	// 这个 directorys 可以是软连接
	dir := path.Join(directorys...)
	lists, err := os.ReadDir(dir)
	if err != nil {
		// log.Fatalf("list dir err:path=%s, err=%v", dir, err)
	}

	dirs_files = make([]fs.DirEntry, 0, 10)

	for _, f := range lists { // sorted by name
		if IsDir(path.Join(dir, f.Name())) {
			// 包含 软连接!
			dirs_files = append(dirs_files, f)
		}
	}
	return
}
